package com.wzh.glsc.order.config;

import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

/**
 * @author xiaoming
 * @PackageName:com.wzh.glsc.order.config
 * @ClassName:@{NAME}
 * @Description:
 * @date:@{DATE}@{TIME}
 */
@Configuration
public class MyRabbitConfig {

    @Autowired
    RabbitTemplate rabbitTemplate;

    /*
    * 定制RabbitTemplate
    *   加入注解：@PostConstruct ：放在方法上
    *                   在本类构造器与对象创建完后，再调用这个方法
    * */
    @PostConstruct
    public void initRabitTemplate(){
        //发送端发送的回调
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /**
             * @param correlationData :当前消息的唯一关联数据(本消息的唯一id,在发送消息时，可在参数中配置,类型要一致)
             * @param ack :消息是否成功收到
             * @param cause ： 失败的原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean ack,
                                String cause) {
                System.out.println("消息关联数据，包括消息id >>>"+correlationData);
                System.out.println("消息是否发送成功"+ack);
                System.out.println("消息失败原因"+cause);
            }
        });

        //投递消息到队列失败时，触发该回调
        // setReturnCallback 如果提示已过时，就换成这个
        rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {
            // 原本的参数全部封装到了returnedMessage对象 中
            //ReturnedMessage 中的属性:(原本是以参数的形式)
            //      Message message;  发送失败的消息
            //      int replyCode;      回复的状态码
            //     String replyText;     回复的文本内容
            //     String exchange;     该消息发给哪个交换机
            //     String routingKey;   该消息的路由键
            @Override
            public void returnedMessage(ReturnedMessage returnedMessage) {
                System.out.println(returnedMessage.toString());
            }
        });


    }
}
